package ru.niir.goodfil.utils.filters;

import java.io.Serializable;

/**
 * Простой класс для хранения параметров фильтрации товаров
 */
public class GoodsFilter implements Serializable {
    /**
     * Строка для фильтрации по коду.
     * По-умолчанию ставится % чтобы отфильтровать все.
     */
    private String code = "";

    /**
     * Строка для фильтрации по наименованию.
     * По-умолчанию ставится % чтобы отфильтровать все.
     */
    private String name = "";

    /**
     * Строка для фильтрации по группе товаров.
     * По-умолчанию ставится -1 чтобы отфильтровать все.
     */
    private long goodTypeId = -1;

    /**
     * Для фильтрации фактивно удаленных товаров
     */
    private int isDeleted = -1;

    /**
     * Поле для фильтрации по оригинальному номеру запчасти
     */
    private String oe;

    /**
     * При поиске по коду игнорировать пробелы в коде
     */
    private boolean ignoreSpacesInCode = false;

    /**
     * Только заканчивающиеся
     */
    private boolean onlyDispose = false;

    private boolean onlyWithComments = false;

    private boolean allRows = false;

    private boolean onlyDifferense;

    /**
     * Статический конструктор для выборки по коду
     *
     * @param code код товара
     * @return фильтр
     */
    public static GoodsFilter byCode(String code) {
        GoodsFilter goodsFilter = new GoodsFilter();
        goodsFilter.setCode(code);
        return goodsFilter;
    }

    public static GoodsFilter byCodeWithoutSpaces(String code) {
        GoodsFilter goodsFilter = new GoodsFilter();
        goodsFilter.setCode(code);
        goodsFilter.setIgnoreSpacesInCode(true);
        goodsFilter.setDeleted(0);
        return goodsFilter;
    }

    /**
     * Конструктор без параметров
     */
    public GoodsFilter() {
    }

    /**
     * Конструктор с параметрами
     *
     * @param code       строка для фильтрации по коду (без %)
     * @param name       строка для фильтрации по наименованию (без %)
     * @param goodTypeId идентификатор для фильтрации по коду группы товаров (-1 для фильтрации всех)
     */
    public GoodsFilter(String code, String name, long goodTypeId) {
        //  Вызываем сеттеры, чтобы обернуть переданные строки %%
        setCode(code);
        setName(name);
        setGoodTypeId(goodTypeId);
    }

    /**
     * Строка для фильтрации по коду.
     */
    public String getCode() {
        return code;
    }

    /**
     * Строка для фильтрации по коду.
     */
    public void setCode(String code) {
        this.code = code.toLowerCase();
    }

    /**
     * Строка для фильтрации по наименованию.
     */
    public String getName() {
        return name;
    }

    /**
     * Строка для фильтрации по наименованию.
     */
    public void setName(String name) {
        this.name = name.toLowerCase();
    }

    /**
     * Код группы товаров для фильтрации.
     * -1 для фильтрации всех.
     */
    public long getGoodTypeId() {
        return goodTypeId;
    }

    /**
     * Код группы товаров для фильтрации.
     * -1 для фильтрации всех.
     */
    public void setGoodTypeId(long goodTypeId) {
        this.goodTypeId = goodTypeId;
    }

    /**
     * Для фильтрации фактивно удаленных товаров
     */
    public int getDeleted() {
        return isDeleted;
    }

    /**
     * Для фильтрации фактивно удаленных товаров
     */
    public void setDeleted(int deleted) {
        isDeleted = deleted;
    }

    /**
     * Поле для фильтрации по оригинальному номеру запчасти
     */
    public String getOe() {
        return oe;
    }

    /**
     * Поле для фильтрации по оригинальному номеру запчасти
     */
    public void setOe(String oe) {
        this.oe = oe;
    }

    /**
     * При поиске по коду игнорировать пробелы в коде
     */
    public boolean isIgnoreSpacesInCode() {
        return ignoreSpacesInCode;
    }

    /**
     * При поиске по коду игнорировать пробелы в коде
     */
    public void setIgnoreSpacesInCode(boolean ignoreSpacesInCode) {
        this.ignoreSpacesInCode = ignoreSpacesInCode;
    }

    public boolean isOnlyDispose() {
        return onlyDispose;
    }

    public void setOnlyDispose(boolean onlyDispose) {
        this.onlyDispose = onlyDispose;
    }

    public boolean isOnlyWithComments() {
        return onlyWithComments;
    }

    public void setOnlyWithComments(boolean onlyWithComments) {
        this.onlyWithComments = onlyWithComments;
    }

    public boolean isAllRows() {
        return allRows;
    }

    public void setAllRows(boolean allRows) {
        this.allRows = allRows;
    }

    public boolean isOnlyDifferense() {
        return onlyDifferense;
    }

    public void setOnlyDifferense(boolean onlyDifferense) {
        this.onlyDifferense = onlyDifferense;
    }

    @Override
    public String toString() {
        return "GoodsFilter{" +
                "code='" + code + '\'' +
                ", name='" + name + '\'' +
                ", goodTypeId=" + goodTypeId +
                ", isDeleted=" + isDeleted +
                ", oe='" + oe + '\'' +
                ", ignoreSpacesInCode=" + ignoreSpacesInCode +
                '}';
    }
}
